// 验证权限
function hasPermissions() {
	// 检查是否有_doc目录写入权限
	plus.io.resolveLocalFileSystemURL('_doc/', (entry) => {
		console.log('有_doc目录访问权限');
	}, (e) => {
		console.error('无_doc目录访问权限:', e.message);
	});
}

// Base64验证函数
function isValidBase64(str) {
	// 正则表达式验证字符集和填充
	const regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
	if (!regex.test(str)) {
		return false;
	}

	// 检查填充等号
	const padding = str.split('=').pop().length;
	if (padding > 2) {
		return false; // 不允许超过2个等号
	}

	// 自动补全缺失的等号（可选）
	const missingPadding = (4 - (str.length % 4)) % 4;
	if (missingPadding > 0) {
		str += '='.repeat(missingPadding);
	}

	return true;
}

// 定义MIME类型与魔数的映射关系
const magicNumbers = {
	png: new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]), // PNG
	jpg: new Uint8Array([0xFF, 0xD8, 0xFF]), // JPEG
	gif: new Uint8Array([0x47, 0x49, 0x46, 0x38]), // GIF
	// 可根据需要扩展其他格式
};

//获取MIME类型
function getMIME(base64) {
	const binaryData = atob(base64);
	const buffer = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
	let format = null
	for (const [key, val] of Object.entries(magicNumbers)) {
		if (buffer.length < val.length) continue; // 跳过长度不足的情况
		if (val.every((byte, index) => buffer[index] === byte)) {
			format = key;
			break; // 找到匹配后立即终止循环
		}
	}
	return format
}

export function saveImage(base64) {
	return new Promise((resolve, reject) => {
		try {
			hasPermissions()
			// 增强Base64验证逻辑
			// if (!isValidBase64(base64)) return reject(new Error('无效的Base64字符串'));
			// 获取文件后缀
			const format = getMIME(base64)
			if (!format) return reject(new Error(`Base64数据格式与声明的MIME类型不受支持`));

			// 初始化文件名和文件路径信息
			const filename = `temp_${Date.now()}.${format}`;
			const filePath = `_doc/${filename}`;

			//创建Bitmap对象并加载数据
			let bitmap = new plus.nativeObj.Bitmap(filename);
			bitmap.loadBase64Data(
				`data:image/${format};base64,` + base64,
				() => {
					console.log("Base64图片加载成功");
					// 保存到文件
					bitmap.save(
						filePath, {},
						(i) => {
							console.log("保存成功:", i);
							bitmap.clear(); // 释放资源
							resolve(filePath);
						},
						(e) => {
							console.error("保存失败:", e);
							bitmap.clear();
							reject(e);
						}
					);
				},
				(e) => {
					console.error("加载失败:", e);
					bitmap.clear();
					reject(e);
				}
			);
		} catch (error) {
			reject(error);
		}
	});
}

export function delImage(filename) {
	return new Promise((resolve, reject) => {
		try {
			const filePath = `_doc/${filename}`;
			// 检查文件是否存在
			plus.io.resolveLocalFileSystemURL(filePath, (entry) => {
				entry.remove(
					() => resolve('删除成功'),
					(e) => reject('删除失败: ' + e.message)
				);
			}, (e) => {
				reject('文件不存在: ' + e.message);
			});
		} catch (error) {
			reject(error);
		}
	});
}